.. _ecmLmCtl_Begin: ecmLmCtl_Begin ============== -------------- SYNOPSIS -------- .. code-block:: none t_success ecmLmCtl_Begin( t_i32 NetID, t_i32 LmMapIndex, t_ui32 AxisMask1, t_ui32 AxisMask2, t_i32 *ErrCode ) DESCRIPTION ----------- - 이 함수는 하나의 리스트 모션맵에 대해서 리스트 모션 기능을 시작합니다. - 리스트 모션이 시작 되면 해당 리스트 모션 맵에 포함된 축들의 이송 명령들은 리스트모션 테이블에 등록 되고 난 후에 ecmLmCtl_Run() 함수가 실행된 이후에 일괄적으로 실행되게 됩니다. PARAMETER --------- - NetID : Network 번호 - LmMapIndex : 시작하고자 하는 대상 LIST-Motion 맵 인덱스. LIST -Motion 맵은 최대 8개까지 지원되므로 이 값은 0 ~ 7의 숫자이어야 합니다. - AxisMask1 : 0 ~ 31번 축 중에서 LIST-Motion에 참여하는 축을 선택하는 마스크 값입니다. 이 값의 각 비트 별 값의 의미는 아래 표와 같습니다. +------------+----------------------------------------------+ | Bit Number | Meaning | +============+==============================================+ | BIT00 | 0번 축의 포함 여부 (0 : 포함안함, 1 : 포함) | +------------+----------------------------------------------+ | BIT01 | 1번 축의 포함 여부 (0 : 포함안함, 1 : 포함) | +------------+----------------------------------------------+ | BIT02 | 2번 축의 포함 여부 (0 : 포함안함, 1 : 포함) | +------------+----------------------------------------------+ | : | | +------------+----------------------------------------------+ | BIT31 | 31번 축의 포함 여부 (0 : 포함안함, 1 : 포함) | +------------+----------------------------------------------+ - AxisMask2 : 32 ~ 63번 축 중에서 LIST-Motion에 참여하는 축을 선택하는 마스크 값입니다. 이 값의 각 비트 별 값의 의미는 아래 표와 같습니다. +------------+----------------------------------------------+ | Bit Number | Meaning | +============+==============================================+ | BIT00 | 32번 축의 포함 여부 (0 : 포함안함, 1 : 포함) | +------------+----------------------------------------------+ | BIT01 | 33번 축의 포함 여부 (0 : 포함안함, 1 : 포함) | +------------+----------------------------------------------+ | BIT02 | 34번 축의 포함 여부 (0 : 포함안함, 1 : 포함) | +------------+----------------------------------------------+ | : | | +------------+----------------------------------------------+ | BIT31 | 63번 축의 포함 여부 (0 : 포함안함, 1 : 포함) | +------------+----------------------------------------------+ - ErrCode : 이 매개 변수를 통하여 현재의 에러 코드를 반환합니다. 단, 이 매개 변수에 NULL을 전달하면 에러 코드를 반환하지 않습니다. RETURN VALUE ------------ - 이 리턴값은 불 형(Boolean Type) 을 가지고 있습니다. +-------+--------------------------------------+ | Value | Meaning | +=======+======================================+ | 0 | 함수 수행에 실패하였음을 의미합니다. | +-------+--------------------------------------+ | 1 | 함수 수행에 성공하였음을 의미합니다. | +-------+--------------------------------------+ REFERENCE --------- - 이 함수를 실행한 이후에 리스트모션에 포함된 축들의 이송함수를 실행하면 해당 이송 명령은 리스트모션 테이블에 등록되게 됩니다. 그리고 실제 이송은 ecmLmCtl_Run() 함수가 실행된 이후에 수행됩니다. - :ref:`ecmSxMot_VMoveStart` 함수와 같이 목표위치가 결정되지 않는 이송명령은 리스트모션 으로 등록할 수 없습니다. 다축동시구동 함수(ecmMxMot) 의 접두어로 이름 지어진 이송 함수)들은 리스트모션으로 등록할 수 없습니다. - 리스트모션으로 등록 가능한 함수들은 아래 표와 같습니다. +-------------------------------------+ | 리스트 모션으로 등록 사능한 함수 명 | +=====================================+ | :ref:`ecmSxCfg_SetSpeedPatt` | +-------------------------------------+ | :ref:`ecmSxCfg_SetJerkRatio` | +-------------------------------------+ | :ref:`ecmSxMot_MoveStart` | +-------------------------------------+ | :ref:`ecmSxMot_MoveToStart` | +-------------------------------------+ | :ref:`ecmIxCfg_MapAxes` | +-------------------------------------+ | :ref:`ecmIxCfg_UnmapAxes` | +-------------------------------------+ | :ref:`ecmIxCfg_SetSpeedPatt` | +-------------------------------------+ | :ref:`ecmIxCfg_SetJerkRatio` | +-------------------------------------+ | :ref:`ecmIxMot_LineStart` | +-------------------------------------+ | :ref:`ecmIxMot_LineToStart` | +-------------------------------------+ | :ref:`ecmIxMot_ArcAng_R_Start` | +-------------------------------------+ | :ref:`ecmIxMot_ArcAng_A_Start` | +-------------------------------------+ | :ref:`ecmIxMot_ArcPos_R_Start` | +-------------------------------------+ | :ref:`ecmIxMot_ArcPos_A_Start` | +-------------------------------------+ | :ref:`ecmIxMot_Arc3P_R_Start` | +-------------------------------------+ | :ref:`ecmIxMot_Arc3P_A_Start` | +-------------------------------------+ EXAMPLE ````````````` .. code-block:: cpp :linenos: //본 예제는 ListMoiton 을 등록하고 사용하는 예제입니다. #include "ComiEcatSdk_Api.h" #define AXIS 0 #define LM_MAP 0 #define VEL1 100000 #define VEL2 300000 #define VEL3 100000 #define ACC 800000 #define DEC 800000 t_32 Error_Num = 0;//함수 별 에러 코드 저장 변수 /*************************************************************** * OnProgramInitial : 이 함수는 가상의 함수로서 프로그램 초기화 루틴이 * 적용되는 부분을 의미합니다. //5~9장 사이 내용 참고 ***************************************************************/ void OnProgramInitial() { TEcDevInfo Device_Info; //디바이스 정보 저장 할 구조체 t_i32 Device_Num = 0; t_success nIsLoaded = ecDll_Load (); if(!ecGn_LoadDevices(&Error_Num)){ //장치 로드 //로드 실패시 예외 처리 } if(!ecGn_GetDevInfo(Device_Num,&Device_Info, &Error_Num)){ //디바이스 정보 로드 실패 시 예외 처리 } //ALState OP모드로 전환 ecNet_SetAlState(Device_Info.NetIdx, ecAL_STATE_OP, &Error_Num); ecmSxCtl_SetSvon(Device_Info.NetIdx, AXIS, &Error_Num); } //OnProgramInitial 함수 끝 /******************************************************************** * OnListMotion: 이 함수는 ListMotion 등록 및 시작 부분 * 많은 세팅 관련 함수가 있지만 경우에 따라 사용자가 선택해서 사용 *********************************************************************/ void OnListMotion () { // 1) ListMotion 기능 활성화(시작) ecmLmCtl_Begin (Device_Info.NetIdx, LM_MAP, (0x1< 이후에 등록되는 스텝들은 모두 스텝아이가 0으로 부여된다. ecmLmCfg_SetStepId (Device_Info.NetIdx, LM_MAP, 0, &Error_Num); // 2) MOVE#1 작업 등록 ecmSxCfg_SetSpeedPatt(Device_Info.NetIdx, AXIS, ecmSMODE_TRAPE, 0, VEL1, VEL1, ACC, 0, &Error_Num); ecmSxMot_MoveToStart(Device_Info.NetIdx, AXIS, 300000, &Error_Num); // 3) 리스트모션 실행 시작 ecmLmCtl_Run (Device_Info.NetIdx, AXIS, & Error_Num); // 4) MOVE#2 작업 등록 ecmSxCfg_SetSpeedPatt(Device_Info.NetIdx, AXIS, ecmSMODE_TRAPE, VEL1, VEL3, VEL2, ACC, DEC, &Error_Num); ecmSxMot_MoveToStart(Device_Info.NetIdx, AXIS, 800000, &Error_Num); // 5) MOVE#3 작업 등록 ecmSxCfg_SetSpeedPatt(Device_Info.NetIdx, AXIS, ecmSMODE_TRAPE, VEL3, 0, VEL3, 0, DEC, &Error_Num); // StepID를 10으로 설정 => 이후에 등록되는 스텝들은 모두 스텝아이가 10으로 부여된다. ecmLmCfg_SetStepId (Device_Info.NetIdx, LM_MAP, 0, & Error_Num); // 마지막 스텝 등록, 이 스텝의 아이디는 10이 된다. ecmSxMot_MoveToStart(Device_Info.NetIdx, AXIS, 800000, &Error_Num); // 6) 리스트모션 실행 완료 체크 t_i32 LmRunSts, RunCount, RunStepId; while(1){ LmRunSts = ecmLmSt_GetRunSts(Device_Info.NetIdx, LM_MAP, &Error_Num); if(LmRunSts == ecmLM_STS_RUN_COMPT || LmRunSts == ecmLM_STS_DISABLED){ break; // 등록된 리스트모션의 스텝들이 모두 완료되었으므로 상태감시 완료! } ecmLmSt_GetRunStepInfo (Device_Info.NetIdx, LM_MAP, &RunCount, &RunStepId, NULL, &Error_Num); TRACE("%d 번째 스텝이 실행되고 있습니다.\n", RunCount); if(RunStepId == 10){ TRACE("마지막 스텝이 실행되고 있습니다.\n"); } Sleep(10); } // 7) 리스트모션 기능 비봘성화(종료) ecmLmCtl_End(Device_Info.NetIdx, LM_MAP, &Error_Num); }